import { AssetManager, game, instantiate, Prefab, resources, sys } from 'cc';
import { DEBUG } from 'cc/env';
import CanvasExt from 'db://cocos-ext/base/CanvasExt';
import { games, lobby, players, rooms, yy } from 'yycore';

export default class YYExt {

    /**
     * 获取config.json配置的内置游戏ID
     * @returns 
     */
    static get cfgGameID(): number {
        if (yy.env.cfg.games && yy.env.cfg.games.length > 0) {
            return yy.env.cfg.games[0].id;
        } else {
            return 0;
        }
    }

    /**
     * 获取内置游戏信息
     */
    static get cfgGame(): games.Game {
        const gameid = YYExt.cfgGameID;
        if (!gameid)
            return null;
        return games.gameCenter.getGameByID(gameid);
    }

    static get cfgGameInfo(): lobby.GameInfo {
        const gameid = YYExt.cfgGameID;
        if (!gameid)
            return null;
        return lobby.gameInfoMgr.getGameInfo(gameid);
    }

    /**
     * 获取内置游戏多语言名称
     */
    static get cfgGameName(): string {
        const gameInfo = YYExt.cfgGame;
        if (!gameInfo)
            return "";
        return gameInfo.getName(yy.sys.curLanguage) || gameInfo.getEnName();
    }

    /**
     * 是否允许播放游戏音效
     */
    static get enableSound(): boolean {
        return games.setting.isEffectEnable && !games.setting.isMute;
    }

    /**
     * 是否允许播放背景音乐
     */
    static get enableBGM(): boolean {
        return games.setting.isMusicEnable && !games.setting.isMute;
    }

    /**
     * 是否允许播放任务语言
     */
    static get enableVoice(): boolean {
        return games.setting.isVoiceEnable && !games.setting.isMute;
    }

    /**
     * 获取玩家指定类型游戏货币值；
     * @param moneyType 货币类型（不传值，1、在游戏房间内，获取当前游戏内玩家游戏币值；2、不再游戏房间，获取游戏主货币值）
     */
    static getMoney(moneyType?: number): number {
        const room = rooms.service.getRoomServerInfo();
        if (rooms.service.isInRoom()
            && (room?.playMoneyType == moneyType
                || moneyType == undefined
                || moneyType == null)
        ) {
            return players.myself.currentMoneyCount;
        }
        else {
            if (moneyType == undefined || moneyType == null)
                moneyType = games.base.MoneyID;
            return players.myself.getBodyMoney(moneyType);
        }
    }

    /**
     * 检查当前货币是否小于指定值
     * @param value 比较值
     * @param moneyType 货币类型（不传值，1、在游戏房间内，获取当前游戏内玩家游戏币值；2、不再游戏房间，获取游戏主货币值）
     * @param showTip 是否弹出提示UI(默认弹出提示)
     */
    static checkMoney(value: number, showTip: boolean = true, moneyType?: number): boolean {
        const coin: number = this.getMoney(moneyType);
        const isEnough: boolean = coin >= value;
        if (!isEnough && showTip)
            games.ui.messageBox("no money");
        return isEnough;
    }

    /** 退出游戏策略 */
    static doExitGame() {
        const gameInfo = YYExt.cfgGame;
        const curSceneType = games.ui.manager.getCurrentSceneType();
        if (gameInfo && gameInfo.getGameRoomType() <= 2 && curSceneType == games.ui.SceneType.Game) {
            // 有选场UI，且在游戏内, 返回选场
            games.gameRunHelper.exitGame();
        }
        else {
            // 点击返回直接退出游戏
            lobby.service.reqLogoutLobby();
            setTimeout(() => game.end(), 200);
        }
    }

    /**
     * 向yycore框架注册公用UI
     * @param pb 预制体
     * @param uiType 注册公用UI类型
     */
    static regPublicUI(pb: Prefab, uiType: games.ui.UIType) {
        games.ui.manager.regPublicUI(uiType, (param?: games.ui.UIParam, subType?: any) => {
            if (!!param?.isHide) {
                DEBUG && console.debug(`隐藏 UIType.${games.ui.UIType[uiType]}`);
                const nd = CanvasExt.canvasNode.getChildByName(pb.name);
                if (nd)
                    nd.destroy();
                return null;
            }
            else {
                DEBUG && console.debug(`显示 UIType.${games.ui.UIType[uiType]}`);
                const nd = instantiate(pb);
                nd.name = pb.name;
                const parent = param?.parentNode || CanvasExt.canvasNode;
                parent.addChild(nd);

                const comp: any = nd.getComponent("ComponentExt");
                if (param) {
                    comp.init(param);
                }
                return comp;
            }
        });
    }

    /**
     * 展示第三方的兑换UI
     */
    static showSDKExchangeUI() {
        const url = yy.utils.getURLParam()?.exchange_url;
        if (!url) {
            DEBUG && console.error("[HarryNR] 获取不到第三方 exchange_url");
            return;
        }

        // 打开网页
        try {
            sys.openURL(url);
        }
        catch (error) {
            DEBUG && console.error("[HarryNR] 打开第三方兑换地址失败, exchange_url: ", url);
            return;
        }
    }

    /**
     * 获取指定的Bundle包
     * @param bundleName 包名
     * @returns 
     */
    static getBundle(bundleName: string): AssetManager.Bundle {
        if (!bundleName.length)
            return null;
        // cocos默认bundle
        if (bundleName == "resources")
            return resources;
        // 自定义bundle
        const bundle = games.bundleMgr.get(bundleName);
        if (!bundle) {
            DEBUG && console.error("no found bundle ", bundleName);
            return null;
        }
        return bundle;
    }

}